import org.apache.log4j.Logger;

import java.sql.*;

/**
 * Created by zwj on 15/9/20.
 *
 */
public class JdbcBase {
    private static final Logger LOGGER = Logger.getLogger(JdbcBase.class);
    public static void main(String[] args){
        try{
            //1、加载mysql驱动，这句可以不显式加载，没有这句也会加载驱动程序。
            Class.forName("com.mysql.jdbc.Driver");
            //2、提供JDBC的url
            String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk";
            //3、创建数据库的连接
            String username = "root";
            String password = "1234";
            Connection connection = DriverManager.getConnection(url, username, password);
            //4、创建一个Statement
            Statement statement = connection.createStatement();
            //5、执行SQL语句
            ResultSet resultSet = statement.executeQuery("select * from user_info");
            //6、处理结果
            while (resultSet.next()){
                String name1 = resultSet.getString(1);
                String name2 = resultSet.getString(2);
                String name3 = resultSet.getString(3);
                LOGGER.info(name1 + " " + name2 + " " + name3);
            }
            //7、关闭JDBC对象
            if(resultSet != null){
                resultSet.close();
            }
            if(statement != null){
                statement.close();
            }
            if(connection != null){
                connection.close();
            }

        } catch (ClassNotFoundException e){
            LOGGER.error("找不到驱动程序，加载失败");
            e.printStackTrace();
        } catch (SQLException e){
            LOGGER.error("数据库连接失败");
            e.printStackTrace();
        }
    }

}

/*
//JDBC连接数据库的步骤
        1、加载mysql驱动
        2、提供JDBC的url
        3、创建数据库的连接
        要连接数据库，需要向java.sql.DriverManager请求并获得Connection对象，该对象就代表一个数据库的连接。
        使用DriverManager的getConnectin(String url , String username ,String password )方法
        传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

        4、创建一个Statement
            •要执行SQL语句，必须获得java.sql.Statement实例，Statement实例分为以下3
            种类型：
            1、执行静态SQL语句。通常通过Statement实例实现。
            2、执行动态SQL语句。通常通过PreparedStatement实例实现。 （继承了Statement）：表示预编译的SQL语句对象。SQL语句被预编译并且存储在PreparedStatement对象中，然后可以使用此对象高效地多次执行该语句。
            3、执行数据库存储过程。通常通过CallableStatement实例实现。（继承了PreparedStatement）：用于执行SQL存储过程的接口。

        5、执行SQL语句
            Statement接口提供了三种执行SQL语句的方法：executeQuery 、executeUpdate
                    和execute
            1、ResultSet executeQuery(String sqlString)：执行查询数据库的SQL语句
            ，返回一个结果集（ResultSet）对象。
            2、int executeUpdate(String sqlString)：用于执行INSERT、UPDATE或
            DELETE语句以及SQL DDL语句，如：CREATE TABLE和DROP TABLE等
            3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的
            语句。
            具体实现的代码：
            ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
            int rows = stmt.executeUpdate("INSERT INTO ...") ;
            boolean flag = stmt.execute(String sql) ;

        6、处理结果
            两种情况：
            1、执行更新返回的是本次操作影响到的记录数。
            2、执行查询返回的结果是一个ResultSet对象。
            • ResultSet包含符合SQL语句中条件的所有行，并且它通过一套get方法提供了对这些
            行中数据的访问。
            • 使用结果集（ResultSet）对象的访问方法获取数据：
            while(rs.next()){
                String name = rs.getString("name") ;
                String pass = rs.getString(1) ; // 此方法比较高效
            }
            （列是从左到右编号的，并且从列1开始）
        7、关闭JDBC对象
            操作完成以后要把所有使用的JDBC对象全都关闭，以释放JDBC资源，关闭顺序和声
            明顺序相反：
            1、关闭记录集
            2、关闭声明
            3、关闭连接对象
            if(rs != null){   // 关闭记录集
                try{
                    rs.close() ;
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            }
            if(stmt != null){   // 关闭声明
                try{
                    stmt.close() ;
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            }
            if(conn != null){  // 关闭连接对象
                try{
                    conn.close() ;
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            }
*/